190 T = R(1): FOR I = 2 TO 4:R(I -1) = R(I): NEXT :R(4) = T: RETURN : REM :rotate up
200 T = R(4): FOR I = 3 TO 1 STEP -1:R(I +1) = R(I): NEXT :R(1) = T: RETURN : REM :rotate down
210 FOR I = 1 TO 4:US(I) = R(I): NEXT : GOSUB 190:DR = 3: GOSUB 150: VTAB 5: HTAB 3: PRINT SPC( 17);: HTAB 4:L = 1:N$ = L$: PRINT L$;
220 PRINT "_"; CHR$(8);: POKE -16368,0: WAIT -16384,128: GET L$: ON L$ < > CHR$(13) AND L = 8 GOTO 250: IF L$ = CHR$(13) THEN R(4) = VAL(N$): PRINT :XC$ = ">": ON PRTR GOSUB 1000:CM = 0: RETURN
230 IF L$ = "e" THEN L$ = "E": REM :must be capital to function
240 IF (L$ > = "0" AND L$ < = "9") OR L$ = "." OR L$ = "E" OR L$ = "e" THEN N$ = N$ +L$:L = L +1: PRINT L$;: GOTO 220
250 IF L$ = CHR$(8) OR L$ = CHR$(127) OR L$ = CHR$(24) THEN ON L = 1 OR L$ = CHR$(24) GOTO 200:L = L -1: PRINT " "; CHR$(8); CHR$(8);:N$ = LEFT$(N$, LEN(N$) -1):CM = 0: GOTO 220
420 POKE -16368,0: WAIT -16384,128: GET L$: IF (L$ > = "0" AND L$ < = "9") OR L$ = "." THEN GOSUB 210: IF NOT CM THEN 410: REM :accept number
430 POKE 6, ASC(L$): CALL 768 +12,CM$:T% = PEEK(7): ON T% = 0 GOTO 420: IF L$ < > CHR$(26) THEN FOR I = 1 TO 4:US(I) = R(I): NEXT : REM :save stack in case of undo
440 XC$ = L$: IF XC$ = CHR$(13) THEN XC$ = ">": REM :use ">" to denote enter key
450 MX = 0: ON T% GOSUB 190,200,190,200,1090,1110,1100,520,530,540,550,560,570,580,990,1000,1010,1030,300,1200,590,600,610,1120,490,500,510,470,480,1130,650,620,830,840,870,970,1140,730,760,800: ON RDR GOTO 370: GOTO 400
460 REM :----math functions----
470 R(3) = R(4) ^R(3): GOSUB 200:R(1) = 0: ON PRTR GOSUB 1000: RETURN : REM :X ^ Y
480 R(4) = 0 -R(4): ON PRTR GOSUB 1000: RETURN : REM :negate X
490 R(4) = INT(R(4)): ON PRTR GOSUB 1000: RETURN : REM :integer
500 R(4) = EXP(R(4)): ON PRTR GOSUB 1000: RETURN : REM :antilog
510 R(4) = LOG(R(4)): ON PRTR GOSUB 1000: RETURN : REM :logarithm
520 R(3) = R(3)/R(4): GOSUB 200:R(1) = 0: ON PRTR GOSUB 1000: RETURN : REM :/
530 R(3) = R(3) *R(4): GOSUB 200:R(1) = 0: ON PRTR GOSUB 1000: RETURN : REM :*
540 R(3) = R(3) +R(4): GOSUB 200:R(1) = 0: ON PRTR GOSUB 1000: RETURN : REM :+
550 R(3) = R(3) -R(4): GOSUB 200:R(1) = 0: ON PRTR GOSUB 1000: RETURN : REM :-
560 R(4) = SIN(R(4)): ON PRTR GOSUB 1000: RETURN : REM :sine
570 R(4) = COS(R(4)): ON PRTR GOSUB 1000: RETURN : REM :cosine
580 R(4) = TAN(R(4)): ON PRTR GOSUB 1000: RETURN : REM :tangent
590 R(4) = ATN(R(4)/ SQR( -R(4) *R(4) +1)): ON PRTR GOSUB 1000: RETURN : REM :arcsin
600 R(4) = - ATN(R(4)/ SQR( -R(4) *R(4) +1)) +1.5708: ON PRTR GOSUB 1000: RETURN : REM :arccos
610 R(4) = ATN(R(4)): ON PRTR GOSUB 1000: RETURN : REM :arctan
620 DI = DI +1:DI = DI -(3 *(DI = 3)): RETURN : REM :toggle display base
660 IF DS THEN PRINT : PRINT : PRINT " Clear old data?": PRINT SPC( 5);"(Y) or (N)": POKE -16368,0: WAIT -16384,128: GET L$: IF L$ = "y" OR L$ = "Y" THEN DS = 0: REM :erase old data by setting pointer to zero
670 PRINT "Enter data or a": PRINT "blank line to quit.": POKE 34,21: GOTO 700
680 VTAB 22: HTAB 19: PRINT : PRINT DS +1;: INPUT ":";A$: ON (A$ = "") GOTO 810:B$ = "": FOR I = 1 TO LEN(A$):X$ = MID$ (A$,I,1):X$ = CHR$( ASC(X$) -(32 *( ASC(X$) >96))): ON (X$ <"0" OR X$ >"9") AND X$ < >"E" AND X$ < >"." GOTO 690:B$ = B$ +X$
740 FOR I = ST TO DS: PRINT RIGHT$(" " + STR$(I),2);": ";D(I);: ON I = DS AND ED = 0 GOTO 750: POKE -16368,0: WAIT -16384,128: GET L$: ON L$ = CHR$(27) OR ((L$ = "C" OR L$ = "c") AND ED = 1) GOTO 750: PRINT : NEXT : ON ED = 0 GOTO 720: RETURN
750 V = I:I = 999: NEXT : PRINT : ON ED = 0 GOTO 720: RETURN : REM :if ESC tapped or at end, leave loop
760 ON DS = 0 GOTO 820:ED = 1:ST = 1:M$ = "End of data." + CHR$(13): REM :editing on, start at data point one
770 GOSUB 640: POKE 34,19: PRINT "Press (C) to change": PRINT "or (ESC) to stop.": PRINT : POKE 34,22: GOSUB 740: ON L$ < >"C" AND L$ < >"c" GOTO 710: POKE 34,19: HOME : PRINT "Enter new value.": PRINT "Old value: ";D(V)
780 VTAB 22: HTAB 19: PRINT : PRINT V;: INPUT ":";A$:A = VAL(A$): ON A$ = "" GOTO 790:D(V) = A: REM :get new value for point and change it
790 ST = V: GOTO 770: REM :start again where we left off
800 ON DS = 0 GOTO 820:T = R(4): FOR I = 1 TO DS:R(4) = D(I): GOSUB 1000: NEXT :R(4) = T: RETURN : REM :print data set
830 ON DS = 0 GOTO 820:S1 = 0:S2 = 0: FOR I = 1 TO DS:S1 = S1 +D(I):S2 = S2 +D(I) *D(I): NEXT :S = S1/DS: GOSUB 190:R(4) = SQR((S2 -DS *S *S)/(DS -1)): ON PRTR GOSUB 1000: RETURN : REM :compute standard deviation (yuck!)
840 ON DS = 0 GOTO 820: GOSUB 640: PRINT : PRINT SPC( 5 -MX);" computing ":MX = 1 -MX:SW = 0: FOR I = 1 TO DS -1: IF D(I) >D(I +1) THEN T = D(I +1):D(I +1) = D(I):D(I) = T:SW = 1: REM :median
850 NEXT : ON SW GOTO 840: GOSUB 190: IF INT(DS/2) = DS/2 THEN R(4) = (D(DS/2) +D((DS/2) +1))/2: ON PRTR GOSUB 1000: GOTO 820: REM :finish up bubble sort & compute middle position
860 R(4) = D((DS/2) +.5): ON PRTR GOSUB 1000: GOTO 820: REM :different handling for odd number of data elements
870 ON DS = 0 GOTO 820: GOSUB 640: PRINT : PRINT SPC( 5);"computing":MC = 1:MM(0,1) = D(1):MM(1,1) = 0: FOR I = 1 TO DS:V = D(I): FOR J = 1 TO MC: IF MM(0,J) = V THEN MM(1,J) = MM(1,J) +1:J = MC +1: NEXT : GOTO 890: REM :mode
880 NEXT :MC = MC +1:MM(0,MC) = V:MM(1,MC) = 1: REM :no record exists for it; make one
890 NEXT :CT = 0:NH = MM(1,1): FOR I = 1 TO MC: IF MM(1,I) = >NH THEN NH = MM(1,I):Z = I
900 NEXT : FOR I = 1 TO MC: ON MM(1,I) < >NH GOTO 920: ON Z = I GOTO 920
910 I = 999: NEXT :M$ = "This data is" + CHR$(13) +"multimodal.": GOTO 710: REM :andthat'snogood!
920 NEXT :NT = 0:BV = 0: FOR I = 1 TO MC: IF MM(1,I) = >NT THEN NT = MM(1,I):BV = MM(0,I): REM :this is largest so far
930 NEXT : IF MC = 1 THEN M$ = "All values are" + CHR$(13) +"equal": GOTO 710
940 CN = MM(1,1): FOR I = 1 TO MC: IF MM(1,I) = CN THEN NEXT :M$ = "Every value":NT = CN: GOTO 960: REM :if none stand out
1010 GOSUB 1050: PRINT SPC( 15 * INT(TC)); RIGHT$(" " + STR$(R(3)),12);" ": GOSUB 1020: GOTO 1000: REM :dump Y & X (15/2 spaces)
1020 LI = LI +1: IF LI < >PL THEN RETURN : REM :haven't reached end of this column yet
1030 TC = TC +1: IF TC = 5 THEN GOSUB 1050: FOR LL = 1 TO 5: PRINT : NEXT :LI = 1: GOSUB 1060:TC = 0: RETURN : REM :at end of last column, start new page
1040 GOSUB 1050: PRINT RLF$;: FOR LL = 1 TO LI -EP: PRINT TS$;: NEXT : PRINT FLF$;: GOSUB 1060:LI = 1: RETURN : REM :reverse up to top of page in preparation for next column of numbers
1050 PRINT CHR$(4);"PR#"PS: PRINT CHR$(9);"80N";: RETURN : REM :turn printer on
1060 PRINT CHR$(4);"PR#0": RETURN : REM :turn printer off
1070 REM :----stack handling subroutines----
1080 HTAB 21 - LEN(A$)/2: PRINT A$: RETURN : REM :center line
1090 T = R(3):R(3) = R(4):R(4) = T: RETURN : REM :swap X & Y
1100 FOR I = 0 TO 3:R(I +1) = 0: NEXT : RETURN : REM :clear all regs
1110 R(4) = 0: RETURN : REM :clear x
1120 GOSUB 190:R(4) = R(3): ON PRTR GOSUB 1000: RETURN : REM :enter
1130 FOR I = 1 TO 4:R(I) = US(I): NEXT : RETURN : REM :undo
1140 GOSUB 200:R(1) = 0: RETURN : REM :pop up
1150 REM :----title page----
1160 TEXT : NORMAL : FOR I = 1 TO 24: CALL -912: NEXT : FOR I = 1 TO 39: VTAB 24: HTAB I: PRINT "-";: VTAB 1: HTAB 41 -I: PRINT "-";: NEXT : POKE 1024, ASC("-") +128: POKE 2039, ASC("-") +128:S$ = ""
1170 VTAB 3:B$ = " N U M B E R C R U N C H E R ": FOR I = 1 TO LEN(B$):S$ = S$ +" ": NEXT : INVERSE :A$ = S$: GOSUB 1080:A$ = B$: GOSUB 1080:A$ = S$: GOSUB 1080: NORMAL : VTAB 7:A$ = "Copyright 1989, MindCraft Publ. Corp.": GOSUB 1080:A$ = "Concord, MA 01742": GOSUB 1080
1180 VTAB 11:A$ = "Written by Eric C. Mueller": GOSUB 1080: VTAB 18: PRINT " * All operations are stack based": PRINT : PRINT " * Based on Hewlett-Packard calculators"
1190 VTAB 23:A$ = "Press Return": GOSUB 1080: POKE -16368,0: WAIT -16384,128: GET L$: POKE 34,1: POKE 35,23: HOME : RETURN : REM :title screen
1200 HOME : VTAB 11:A$ = "Are you sure you want to quit?": GOSUB 1080:A$ = "(Y) or (N)": PRINT : GOSUB 1080: POKE -16368,0: WAIT -16384,128: GET L$: IF L$ < >"Y" AND L$ < >"y" THEN GOTO 310
1210 TEXT : HOME : IF PRTR THEN PRINT : PRINT CHR$(4);"PR#0"
1260 POKE 216,0: ONERR GOTO 1240: REM :clear error and reset error trap
1270 ER = PEEK(222):EL = PEEK(218) + PEEK(219) *256: IF ER = 69 THEN ER$ = "OVERFLOW OCCURRED"
1280 IF ER = 255 THEN 370: REM :ignore ctrl-c
1290 IF ER = 53 THEN ER$ = "ILLEGAL OPERATION"
1300 IF ER = 133 THEN ER$ = "DIVISION BY ZERO"
1310 IF ER = 16 THEN ER$ = "TYPO: LINE " + STR$(EL)
1320 IF ER$ = "" THEN ER$ = "ERR " + STR$( PEEK(222)) +" @ " + STR$( PEEK(218) + PEEK(219) *256): REM :generic error message
1330 IF EL = 1040 THEN ER$ = "PRINTER ERROR"
1340 VTAB 5: HTAB 3: PRINT SPC( 17);: HTAB 3: INVERSE : PRINT ER$;: NORMAL : POKE -16368,0: WAIT -16384,128: GET L$: HTAB 3: PRINT SPC( 17): GOSUB 1130: POP : GOTO 370: REM :restore stack and try for another command
1350 REM :----misc program init----
1360 FOR I = 768 TO 768 +206: READ X: POKE I,X: NEXT : IF PEEK( -1101) < >6 THEN CALL 927: REM poke in m/l, and if II+ found, call uppercase converter
1370 RETURN
1380 DATA 76,15,3,76,35,3,76,54,3,76,88,3,76,98,3,165,6,32,91,251,169,2,133,36,160,17,169,160,32,237,253,136,208,248,96,169,14,133,36,169,164,32,237,253,165,7,32,218,253
1390 DATA 165,6,76,218,253,169,2,133,36,169,165,32,237,253,165,7,32,70,3,165,6,162,7,42,72,169,176,144,2,169,177,32,237,253,104,202,16,241,96,104,168,104,166,223,154,72
1400 DATA 152,72,96,165,6,41,127,201,96,144,4,41,95,133,6,32,190,222,32,123,221,32,108,221,160,0,177,160,141,158,3,200,177,160,72,200,177,160,133,161,104,133,160,160,0,177,160,197,6,240,8,200,204,158,3,208,244,160,255,200,132,7,96,0
1410 DATA 165,103,133,0,165,104,133,1,160,1,177,0,240,33,160,4,177,0,240,13,48,8,201,96,144,4,41,95,145,0,200,208,239,160,0,177,0,170,200,177,0,133,1,134,0,208,223,96